package 代理模式;

import java.lang.reflect.Proxy;

/**
 * 代理模式：为其他对象提供一种代理以控制这个对象的访问
 */
public class Test {

    // 涉及角色及说明：
    // Subject（抽象主题类）：接口或者抽象类，声明真实主题与代理的共同接口方法
    // RealSubject（真实主题类）：也叫做被代理类或被委托类，定义了代理所表示的真实对象，负责具体业务逻辑的执行，客户端可以通过代理类间接的调用真实主题类的方法
    // Proxy（代理类）：也叫委托类，持有对真实主题类的引用，在其所实现的接口方法中调用真实主题类中相应的接口方法执行
    // Client（客户端类）：使用代理模式的地方
    public static void main(String[] args) {

        // 静态代理
        DogStaticProxy dogProxy1 = new DogStaticProxy(new RedDog());
        dogProxy1.dance();
        System.out.println();

        // 动态代理
        Dog dog = new RedDog();
        DogDynamicProxy dogProxy2 = new DogDynamicProxy(dog);
        //通过Proxy创建代理实例，实际上通过反射来实现的
        Dog dog2 = (Dog) Proxy.newProxyInstance(dog.getClass().getClassLoader(), dog.getClass().getInterfaces(), dogProxy2);
        dog2.dance();
    }
}
